package com.zeratul.common.satoken.handler;

import cn.dev33.satoken.stp.StpInterface;
import cn.hutool.core.util.ObjectUtil;
import com.zeratul.common.satoken.constants.SaTokenConstants;
import com.zeratul.common.satoken.domain.entity.base.LoginUserAdapter;
import com.zeratul.common.satoken.utils.LoginHelper;

import java.util.List;

/**
 * 拓展SaToken的权限/角色查询接口 - 基于当前登录用户信息
 * 并且增加缓存的功能
 */
public abstract class StpInterfaceCacheAdapter implements StpInterface {

    /**
     * 返回指定账号id所拥有的权限码集合
     *
     * @param loginId   账号id
     * @param loginType 账号类型
     * @return 该账号id具有的权限码集合
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        //获取当前登录的用户信息
        LoginUserAdapter loginUser = LoginHelper.getLoginUser();
        if (ObjectUtil.isNull(loginUser)) {
            return List.of();
        }

        //从缓存中获取
        List<String> permissionList = LoginHelper.getTokenSessionValue(SaTokenConstants.PERMISSION_KEY);
        //判断缓存
        if (ObjectUtil.isNotNull(permissionList)) {
            return permissionList;
        }
        //如果没有命中缓存，则调用业务方法
        permissionList = getPermissionList(loginUser);
        //重建缓存
        LoginHelper.setTokenSessionValue(SaTokenConstants.PERMISSION_KEY, ObjectUtil.defaultIfNull(permissionList, List.of()));
        //返回
        return permissionList;
    }

    /**
     * 返回指定账号id所拥有的角色标识集合
     *
     * @param loginId   账号id
     * @param loginType 账号类型
     * @return 该账号id具有的角色标识集合
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        //获取当前登录的用户信息
        LoginUserAdapter loginUser = LoginHelper.getLoginUser();
        if (ObjectUtil.isNull(loginUser)) {
            return List.of();
        }

        //从缓存中获取
        List<String> roles = LoginHelper.getTokenSessionValue(SaTokenConstants.ROLE_KEY);
        //判断缓存
        if (ObjectUtil.isNotNull(roles)) {
            return roles;
        }
        //如果没有命中缓存，则调用业务方法
        roles = getRoleList(loginUser);
        //重建缓存
        LoginHelper.setTokenSessionValue(SaTokenConstants.ROLE_KEY, ObjectUtil.defaultIfNull(roles, List.of()));
        //返回
        return roles;
    }


    /**
     * 获取当前登录用户的权限码集合
     */
    public abstract List<String> getPermissionList(LoginUserAdapter loginUser);

    /**
     * 获取当前登录用户的的角色标识集合
     */
    public abstract List<String> getRoleList(LoginUserAdapter loginUser);
}
